﻿using System;
using System.Collections.Generic;

using System.Text;

using IView;
using DataService.LocalFile;
using DataTransferObject;
using Engine;

namespace Presenter
{
    /*
     * bảo hiểm cho mọi thay đổi OptionForm đều do presenter cập nhật
     * Nhiệm vụ cao cả: Đọc - ghi thông tin cấu hình, tải thông tin cấu hình lên OptinForm
     */
    public class PresenterOptionForm: Presenter
    {
        #region Attributes

        IOptionForm _OptionFormView;
        private JskeEngine jskeEngine;

        // Obj dùng để chứa thông tin cấu hình hệ thống hiện tại
        SystemConfiguration _systemConfigurationObj;

        #endregion

        #region Constructors

        /// <summary>
        /// Initializes a new instance of the <see cref="PresenterOptionForm"/> class.
        /// </summary>
        /// <param name="OptionForm">The option form.</param>
        public PresenterOptionForm(IOptionForm OptionForm, int dataAccessMode)
        {
            Presenter.changeDataServiceMode(dataAccessMode);
            this._OptionFormView = OptionForm;
            jskeEngine = JskeEngine.getInstance(dataServiceMode);
            jskeEngine.PathForSystemConfigFile = OptionForm.PathToSave;
            jskeEngine.LoadSystemConfigFromFileToEngine();
            _systemConfigurationObj = jskeEngine.SystemConfiguration;

        }

        #endregion

        #region Essential methods
        /*
         * doc file va ghi những thông số cấu hình vào trong
         * optionForm. Các thông số này được ghi trong 1 file XML
         * 1. goi dataservice để đọc thông tin cấu hình, trả về object: SystemConfiguration
         * 2. hàm này sẽ cập nhật file định dạng này và đưa vào giao diện qua con trỏ kiểu IOptionForm
         */
        /// <summary>
        /// Loads the setting from file.
        /// </summary>
        /// <returns></returns>
        public void LoadSettingFromFile()
        {            
            _OptionFormView.LoadSetting(_systemConfigurationObj);            
        }
        /*
         * chứng năng được sử dụng khi người dùng bấm nút OK
         * 
         */
        /// <summary>
        /// Saves the configuration to file.
        /// </summary>
        /// <returns></returns>
        public bool SaveConfigurationToFile()
        {

            _OptionFormView.CreateConfigurationObj(ref this._systemConfigurationObj);
            return jskeEngine.persistSystemConfig(_systemConfigurationObj);
        }
        /*
         * chức năng được gọi khi người dùng bấm apply
         * 
         */
        /// <summary>
        /// Applies the configuration to file.
        /// </summary>
        /// <param name="OptionForm">The option form.</param>
        /// <returns></returns>
        public void ApplyConfigurationToFile(IOptionForm OptionForm)
        {
            OptionForm.LoadSetting(_systemConfigurationObj);
        }

        /// <summary>
        /// Creates the system config obj from form.
        /// </summary>
        /// <returns></returns>
        private bool CreateSystemConfigObjFromForm()
        {
            // gọi các hàm public của OptionForm ở đây để lấy thông tin ghi vào obj
            return _OptionFormView.CreateConfigurationObj(ref _systemConfigurationObj);
        }

        public void NormalizeTasklistByWorkingHour(int deletedWH)
        {
            jskeEngine.NormalizeTaskWorkingHourIDAt(deletedWH);
        }
        #endregion

        #region bổ sung
        /* @LUÂN
         * CÁC BẠN CÓ THỂ:
         * 1. COMMENT VỀ NHỮNG BỔ SUNG GÓP Ý
         * 2. VIẾT CODE ĐỀ XUẤT TRONG REGION NÀY
         * 
        */


        #endregion
    }
}
